﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace PACKETPARSERMAX20.CORE
{
    public static class GlobalCache
    {
        public static bool writesql = false;
        public static bool ignoreupdate = false;
        public static bool ignoreinsert = false;

        public static List<uint> m_spellInfoIdList = new List<uint>();
        public static SortedList<ChatMsg, string> ChatMsgToNameList = GetChatMsgToNameList();
        private static SortedList<ChatMsg, string> GetChatMsgToNameList()
        {
            SortedList<ChatMsg, string> tChatMsgToNameList = new SortedList<ChatMsg, string>();


            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_ADDON, "ADDON");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_SYSTEM, "SYSTEM");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_SAY, "SAY");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_PARTY, "PARTY");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_RAID, "RAID");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_GUILD, "GUILD");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_OFFICER, "OFFICER");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_YELL, "YELL");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_WHISPER, "WHISPER");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_WHISPER_INFORM, "WHISPER_INFORM");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_REPLY, "REPLY");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_EMOTE, "EMOTE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_TEXT_EMOTE, "TEXT_EMOTE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_MONSTER_SAY, "MONSTER_SAY");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_MONSTER_PARTY, "MONSTER_PARTY");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_MONSTER_YELL, "MONSTER_YELL");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_MONSTER_WHISPER, "MONSTER_WHISPER");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_MONSTER_EMOTE, "MONSTER_EMOTE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_CHANNEL, "CHANNEL");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_CHANNEL_JOIN, "CHANNEL_JOIN");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_CHANNEL_LEAVE, "CHANNEL_LEAVE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_CHANNEL_LIST, "CHANNEL_LIST");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_CHANNEL_NOTICE, "CHANNEL_NOTICE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_CHANNEL_NOTICE_USER, "CHANNEL_NOTICE_USER");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_AFK, "AFK");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_DND, "DND");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_IGNORED, "IGNORED");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_SKILL, "SKILL");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_LOOT, "LOOT");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_MONEY, "MONEY");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_OPENING, "OPENING");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_TRADESKILLS, "TRADESKILLS");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_PET_INFO, "PET_INFO");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_COMBAT_MISC_INFO, "COMBAT_MISC_INFO");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_COMBAT_XP_GAIN, "COMBAT_XP_GAIN");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_COMBAT_HONOR_GAIN, "COMBAT_HONOR_GAIN");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_COMBAT_FACTION_CHANGE, "COMBAT_FACTION_CHANGE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_BG_SYSTEM_NEUTRAL, "BG_SYSTEM_NEUTRAL");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_BG_SYSTEM_ALLIANCE, "BG_SYSTEM_ALLIANCE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_BG_SYSTEM_HORDE, "BG_SYSTEM_HORDE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_RAID_LEADER, "RAID_LEADER");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_RAID_WARNING, "RAID_WARNING");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_RAID_BOSS_WHISPER, "RAID_BOSS_WHISPER");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_RAID_BOSS_EMOTE, "RAID_BOSS_EMOTE");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_FILTERED, "FILTERED");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_BATTLEGROUND, "BATTLEGROUND");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_BATTLEGROUND_LEADER, "BATTLEGROUND_LEADER");
            tChatMsgToNameList.Add(ChatMsg.CHAT_MSG_RESTRICTED, "RESTRICTED");




            return tChatMsgToNameList;
        }
        public static List<uint> knockbackspells = Getknockbackspells();
        public static List<uint> Getknockbackspells()
        {
            List<uint> spelllist = new List<uint>();
            spelllist.Add(45);
            spelllist.Add(568);
            spelllist.Add(4342);
            spelllist.Add(10101);
            spelllist.Add(10833);
            spelllist.Add(10966);
            spelllist.Add(10987);
            spelllist.Add(11019);
            spelllist.Add(11113);
            spelllist.Add(11130);
            spelllist.Add(11876);
            spelllist.Add(11902);
            spelllist.Add(12612);
            spelllist.Add(12882);
            spelllist.Add(12887);
            spelllist.Add(13009);
            spelllist.Add(13018);
            spelllist.Add(13019);
            spelllist.Add(13020);
            spelllist.Add(13021);
            spelllist.Add(13586);
            spelllist.Add(14099);
            spelllist.Add(15593);
            spelllist.Add(15743);
            spelllist.Add(15749);
            spelllist.Add(15847);
            spelllist.Add(16636);
            spelllist.Add(16740);
            spelllist.Add(16785);
            spelllist.Add(17307);
            spelllist.Add(17631);
            spelllist.Add(18072);
            spelllist.Add(18099);
            spelllist.Add(18396);
            spelllist.Add(18500);
            spelllist.Add(18670);
            spelllist.Add(18813);
            spelllist.Add(18945);
            spelllist.Add(19131);
            spelllist.Add(19132);
            spelllist.Add(19196);
            spelllist.Add(19471);
            spelllist.Add(19497);
            spelllist.Add(19633);
            spelllist.Add(19701);
            spelllist.Add(19780);
            spelllist.Add(20508);
            spelllist.Add(20566);
            spelllist.Add(20666);
            spelllist.Add(20686);
            spelllist.Add(21189);
            spelllist.Add(21790);
            spelllist.Add(21868);
            spelllist.Add(21909);
            spelllist.Add(22422);
            spelllist.Add(22715);
            spelllist.Add(22886);
            spelllist.Add(22893);
            spelllist.Add(22916);
            spelllist.Add(22920);
            spelllist.Add(22940);
            spelllist.Add(23339);
            spelllist.Add(23416);
            spelllist.Add(23699);
            spelllist.Add(24189);
            spelllist.Add(24326);
            spelllist.Add(24375);
            spelllist.Add(24857);
            spelllist.Add(25056);
            spelllist.Add(25060);
            spelllist.Add(25188);
            spelllist.Add(25322);
            spelllist.Add(25653);
            spelllist.Add(25744);
            spelllist.Add(25778);
            spelllist.Add(25787);
            spelllist.Add(26007);
            spelllist.Add(26100);
            spelllist.Add(26103);
            spelllist.Add(26167);
            spelllist.Add(26458);
            spelllist.Add(26561);
            spelllist.Add(27133);
            spelllist.Add(27862);
            spelllist.Add(28125);
            spelllist.Add(28318);
            spelllist.Add(28447);
            spelllist.Add(28459);
            spelllist.Add(28725);
            spelllist.Add(28873);
            spelllist.Add(29303);
            spelllist.Add(29585);
            spelllist.Add(29850);
            spelllist.Add(29905);
            spelllist.Add(30121);
            spelllist.Add(30471);
            spelllist.Add(30732);
            spelllist.Add(30852);
            spelllist.Add(30856);
            spelllist.Add(31345);
            spelllist.Add(31389);
            spelllist.Add(31457);
            spelllist.Add(31475);
            spelllist.Add(31755);
            spelllist.Add(31900);
            spelllist.Add(32009);
            spelllist.Add(32020);
            spelllist.Add(32055);
            spelllist.Add(32077);
            spelllist.Add(32324);
            spelllist.Add(32325);
            spelllist.Add(32849);
            spelllist.Add(32888);
            spelllist.Add(32907);
            spelllist.Add(32914);
            spelllist.Add(32935);
            spelllist.Add(32959);
            spelllist.Add(33230);
            spelllist.Add(33707);
            spelllist.Add(33933);
            spelllist.Add(33960);
            spelllist.Add(33970);
            spelllist.Add(33971);
            spelllist.Add(34014);
            spelllist.Add(34109);
            spelllist.Add(34267);
            spelllist.Add(34341);
            spelllist.Add(34342);
            spelllist.Add(34645);
            spelllist.Add(34771);
            spelllist.Add(34793);
            spelllist.Add(34996);
            spelllist.Add(35238);
            spelllist.Add(35314);
            spelllist.Add(35333);
            spelllist.Add(35472);
            spelllist.Add(35473);
            spelllist.Add(35735);
            spelllist.Add(36127);
            spelllist.Add(36140);
            spelllist.Add(36148);
            spelllist.Add(36205);
            spelllist.Add(36251);
            spelllist.Add(36405);
            spelllist.Add(36512);
            spelllist.Add(36624);
            spelllist.Add(36787);
            spelllist.Add(36833);
            spelllist.Add(36966);
            spelllist.Add(36970);
            spelllist.Add(36996);
            spelllist.Add(37102);
            spelllist.Add(37126);
            spelllist.Add(37157);
            spelllist.Add(37179);
            spelllist.Add(37250);
            spelllist.Add(37319);
            spelllist.Add(37412);
            spelllist.Add(37429);
            spelllist.Add(37430);
            spelllist.Add(37433);
            spelllist.Add(37478);
            spelllist.Add(37537);
            spelllist.Add(37572);
            spelllist.Add(37597);
            spelllist.Add(37660);
            spelllist.Add(37681);
            spelllist.Add(37959);
            spelllist.Add(37991);
            spelllist.Add(38045);
            spelllist.Add(38059);
            spelllist.Add(38110);
            spelllist.Add(38342);
            spelllist.Add(38344);
            spelllist.Add(38380);
            spelllist.Add(38538);
            spelllist.Add(38627);
            spelllist.Add(38630);
            spelllist.Add(38682);
            spelllist.Add(38737);
            spelllist.Add(38750);
            spelllist.Add(38760);
            spelllist.Add(38784);
            spelllist.Add(38785);
            spelllist.Add(38846);
            spelllist.Add(38849);
            spelllist.Add(38875);
            spelllist.Add(38907);
            spelllist.Add(39005);
            spelllist.Add(39039);
            spelllist.Add(39068);
            spelllist.Add(39069);
            spelllist.Add(39197);
            spelllist.Add(39313);
            spelllist.Add(39435);
            spelllist.Add(39991);
            spelllist.Add(40077);
            spelllist.Add(40089);
            spelllist.Add(40262);
            spelllist.Add(40434);
            spelllist.Add(40486);
            spelllist.Add(40837);
            spelllist.Add(40881);
            spelllist.Add(40895);
            spelllist.Add(41388);
            spelllist.Add(41534);
            spelllist.Add(41572);
            spelllist.Add(41581);
            spelllist.Add(41587);
            spelllist.Add(41982);
            spelllist.Add(42402);
            spelllist.Add(42495);
            spelllist.Add(42581);
            spelllist.Add(42582);
            spelllist.Add(42584);
            spelllist.Add(42944);
            spelllist.Add(42945);
            spelllist.Add(43108);
            spelllist.Add(43352);
            spelllist.Add(43592);
            spelllist.Add(43673);
            spelllist.Add(44199);
            spelllist.Add(45017);
            spelllist.Add(45327);
            spelllist.Add(45332);
            spelllist.Add(46566);
            spelllist.Add(47115);
            spelllist.Add(48583);
            spelllist.Add(48697);
            spelllist.Add(49198);
            spelllist.Add(49398);
            spelllist.Add(49696);
            spelllist.Add(49722);
            spelllist.Add(49922);
            spelllist.Add(50155);
            spelllist.Add(50375);
            spelllist.Add(50410);
            spelllist.Add(50500);
            spelllist.Add(50516);
            spelllist.Add(50521);
            spelllist.Add(50545);
            spelllist.Add(50652);
            spelllist.Add(51144);
            spelllist.Add(51334);
            spelllist.Add(51490);
            spelllist.Add(51493);
            spelllist.Add(51622);
            spelllist.Add(51678);
            spelllist.Add(51785);
            spelllist.Add(51817);
            spelllist.Add(51830);
            spelllist.Add(51938);
            spelllist.Add(51965);
            spelllist.Add(52029);
            spelllist.Add(52139);
            spelllist.Add(52166);
            spelllist.Add(52460);
            spelllist.Add(52658);
            spelllist.Add(52659);
            spelllist.Add(52717);
            spelllist.Add(52755);
            spelllist.Add(52856);
            spelllist.Add(52870);
            spelllist.Add(52922);
            spelllist.Add(52944);
            spelllist.Add(53071);
            spelllist.Add(53076);
            spelllist.Add(53079);
            spelllist.Add(53084);
            spelllist.Add(53223);
            spelllist.Add(53225);
            spelllist.Add(53226);
            spelllist.Add(53227);
            spelllist.Add(53337);
            spelllist.Add(53363);
            spelllist.Add(53399);
            spelllist.Add(53629);
            spelllist.Add(53630);
            spelllist.Add(53631);
            spelllist.Add(53633);
            spelllist.Add(53850);
            spelllist.Add(53851);
            spelllist.Add(54107);
            spelllist.Add(54109);
            spelllist.Add(54237);
            spelllist.Add(54379);
            spelllist.Add(54434);
            spelllist.Add(54673);
            spelllist.Add(54902);
            spelllist.Add(54956);
            spelllist.Add(54958);
            spelllist.Add(54959);
            spelllist.Add(55284);
            spelllist.Add(55429);
            spelllist.Add(55563);
            spelllist.Add(55696);
            spelllist.Add(55697);
            spelllist.Add(55765);
            spelllist.Add(55821);
            spelllist.Add(55826);
            spelllist.Add(56062);
            spelllist.Add(56104);
            spelllist.Add(56106);
            spelllist.Add(56107);
            spelllist.Add(56431);
            spelllist.Add(56490);
            spelllist.Add(56694);
            spelllist.Add(56695);
            spelllist.Add(56748);
            spelllist.Add(56855);
            spelllist.Add(56861);
            spelllist.Add(56907);
            spelllist.Add(57405);
            spelllist.Add(57560);
            spelllist.Add(57562);
            spelllist.Add(57652);
            spelllist.Add(57784);
            spelllist.Add(58619);
            spelllist.Add(58873);
            spelllist.Add(59013);
            spelllist.Add(59026);
            spelllist.Add(59110);
            spelllist.Add(59147);
            spelllist.Add(59154);
            spelllist.Add(59156);
            spelllist.Add(59158);
            spelllist.Add(59159);
            spelllist.Add(59435);
            spelllist.Add(59507);
            spelllist.Add(59516);
            spelllist.Add(59520);
            spelllist.Add(59700);
            spelllist.Add(59702);
            spelllist.Add(59705);
            spelllist.Add(59730);
            spelllist.Add(59795);
            spelllist.Add(59796);
            spelllist.Add(59798);
            spelllist.Add(59827);
            spelllist.Add(59909);
            spelllist.Add(60010);
            spelllist.Add(60030);
            spelllist.Add(60182);
            spelllist.Add(60205);
            spelllist.Add(60206);
            spelllist.Add(60672);
            spelllist.Add(60786);
            spelllist.Add(60868);
            spelllist.Add(60897);
            spelllist.Add(60899);
            spelllist.Add(60924);
            spelllist.Add(61095);
            spelllist.Add(61110);
            spelllist.Add(61344);
            spelllist.Add(61384);
            spelllist.Add(61387);
            spelllist.Add(61388);
            spelllist.Add(61390);
            spelllist.Add(61391);
            spelllist.Add(61552);
            spelllist.Add(61561);
            spelllist.Add(61565);
            spelllist.Add(61598);
            spelllist.Add(61757);
            spelllist.Add(62126);
            spelllist.Add(62127);
            spelllist.Add(62129);
            spelllist.Add(62132);
            spelllist.Add(62133);
            spelllist.Add(62134);
            spelllist.Add(62135);
            spelllist.Add(62308);
            spelllist.Add(62345);
            spelllist.Add(62346);
            spelllist.Add(62411);
            spelllist.Add(62413);
            spelllist.Add(62613);
            spelllist.Add(62614);
            spelllist.Add(62654);
            spelllist.Add(62666);
            spelllist.Add(62936);
            spelllist.Add(62961);
            spelllist.Add(63723);
            spelllist.Add(64144);
            spelllist.Add(64587);
            spelllist.Add(64619);
            spelllist.Add(64626);
            spelllist.Add(64643);
            spelllist.Add(64650);
            spelllist.Add(64724);
            spelllist.Add(64737);
            spelllist.Add(64872);
            spelllist.Add(65071);
            spelllist.Add(65260);
            spelllist.Add(65262);
            spelllist.Add(65333);
            spelllist.Add(66203);
            spelllist.Add(66511);
            spelllist.Add(66546);
            spelllist.Add(66683);
            spelllist.Add(66794);
            spelllist.Add(67028);
            spelllist.Add(67299);
            spelllist.Add(67345);
            spelllist.Add(67441);
            spelllist.Add(67442);
            spelllist.Add(67462);
            spelllist.Add(67644);
            spelllist.Add(67645);
            spelllist.Add(67646);
            spelllist.Add(67660);
            spelllist.Add(67661);
            spelllist.Add(67662);
            spelllist.Add(67663);
            spelllist.Add(67664);
            spelllist.Add(67665);
            spelllist.Add(67745);
            spelllist.Add(67796);
            spelllist.Add(67797);
            spelllist.Add(67816);
            spelllist.Add(68306);

            return spelllist;
        }

        public static SortedList<uint, GameObjectTemplateSum> GameObjectTemplateSumList = new SortedList<uint, GameObjectTemplateSum>();
        public static GameObjectTemplateSum AddGameObjectTemplateSum(gameobject_template pTemplate, int clientbuild)
        {
            GameObjectTemplateSum tGameObjectTemplateSum = null;

            if (GlobalCache.GameObjectTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (GlobalCache.GameObjectTemplateSumList[pTemplate.entry.Value].clientbuild < clientbuild)
                {
                    GlobalCache.GameObjectTemplateSumList.Remove(pTemplate.entry.Value);
                }
            }

            if (!GlobalCache.GameObjectTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (tGameObjectTemplateSum == null)
                {
                    tGameObjectTemplateSum = new GameObjectTemplateSum() { entry = pTemplate.entry.Value, name = pTemplate.name, typeid = pTemplate.type.Value, clientbuild = clientbuild };
                }


                GlobalCache.GameObjectTemplateSumList.Add(pTemplate.entry.Value, tGameObjectTemplateSum);


                if (writesql) pTemplate.WriteSQLToFile();
            }

            return tGameObjectTemplateSum;
        }

        public static string GetGameObjectName(uint entry)
        {
            if (GlobalCache.GameObjectTemplateSumList.ContainsKey(entry))
                return GlobalCache.GameObjectTemplateSumList[entry].name;

            return null;
        }

        public static SortedList<uint, ItemTemplateSum> ItemTemplateSumList = new SortedList<uint, ItemTemplateSum>();
        public static ItemTemplateSum AddItemTemplateSum(item_template pTemplate, int clientbuild)
        {
            ItemTemplateSum tItemTemplateSum = null;

            if (GlobalCache.ItemTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (GlobalCache.ItemTemplateSumList[pTemplate.entry.Value].clientbuild < clientbuild)
                {
                    GlobalCache.ItemTemplateSumList.Remove(pTemplate.entry.Value);
                }
            }
            if (!GlobalCache.ItemTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (tItemTemplateSum == null)
                {
                    tItemTemplateSum = new ItemTemplateSum() { entry = pTemplate.entry.Value, name = pTemplate.name, clientbuild = clientbuild };
                }

                GlobalCache.ItemTemplateSumList.Add(pTemplate.entry.Value, tItemTemplateSum);


                if (writesql) pTemplate.WriteSQLToFile();
            }

            return tItemTemplateSum;
        }

        public static void AddItemTemplateSum(uint pEntry, string pName)
        {
            if (!GlobalCache.ItemTemplateSumList.ContainsKey(pEntry))
            {
                ItemTemplateSum tItemTemplateSum = new ItemTemplateSum() { entry = pEntry, name = pName, clientbuild = 0 };

                if (!GlobalCache.ItemTemplateSumList.ContainsKey(pEntry))
                {
                    GlobalCache.ItemTemplateSumList.Add(pEntry, tItemTemplateSum);
                }
            }

        }

        public static string GetItemName(uint entry)
        {
            if (GlobalCache.ItemTemplateSumList.ContainsKey(entry))
                return GlobalCache.ItemTemplateSumList[entry].name;

            return null;
        }

        public static SortedList<uint, CreatureTemplateSum> CreatureTemplateSumList = new SortedList<uint, CreatureTemplateSum>();
        public static CreatureTemplateSum AddCreatureTemplateSum(creature_template pTemplate, int clientbuild)
        {
            CreatureTemplateSum tCreatureTemplateSum = null;

            if (GlobalCache.CreatureTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (GlobalCache.CreatureTemplateSumList[pTemplate.entry.Value].clientbuild < clientbuild)
                {
                    GlobalCache.CreatureTemplateSumList.Remove(pTemplate.entry.Value);
                }
            }


            if (!GlobalCache.CreatureTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (tCreatureTemplateSum == null)
                {
                    tCreatureTemplateSum = new CreatureTemplateSum() { entry = pTemplate.entry.Value, name = pTemplate.name, clientbuild = clientbuild };
                }

                GlobalCache.CreatureTemplateSumList.Add(pTemplate.entry.Value, tCreatureTemplateSum);

                if (writesql) pTemplate.WriteSQLToFile();
            }

            return tCreatureTemplateSum;
        }
        public static string GetCreatureName(uint entry)
        {
            if (GlobalCache.CreatureTemplateSumList.ContainsKey(entry))
                return GlobalCache.CreatureTemplateSumList[entry].name;

            return null;
        }

        public static SortedList<uint, QuestTemplateSum> QuestTemplateSumList = new SortedList<uint, QuestTemplateSum>();
        public static QuestTemplateSum AddQuestTemplateSum(quest_template pTemplate, int clientbuild)
        {
            QuestTemplateSum tQuestTemplateSum = null;

            if (GlobalCache.QuestTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (GlobalCache.QuestTemplateSumList[pTemplate.entry.Value].clientbuild < clientbuild)
                {
                    GlobalCache.QuestTemplateSumList.Remove(pTemplate.entry.Value);
                }
            }

            if (!GlobalCache.QuestTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (tQuestTemplateSum == null)
                {
                    tQuestTemplateSum = new QuestTemplateSum() { entry = pTemplate.entry.Value, name = pTemplate.title, clientbuild = clientbuild };
                }


                GlobalCache.QuestTemplateSumList.Add(pTemplate.entry.Value, tQuestTemplateSum);

                if (writesql) pTemplate.WriteSQLToFile();
            }

            return tQuestTemplateSum;
        }

        public static string GetQuestName(uint entry)
        {
            if (GlobalCache.QuestTemplateSumList.ContainsKey(entry))
                return GlobalCache.QuestTemplateSumList[entry].name;

            return null;
        }

        public static SortedList<uint, int> NPCTextSumList = new SortedList<uint, int>();
        public static void AddNPCTextSum(npc_text pTemplate, int clientbuild)
        {
            if (!writesql) return;
            if (GlobalCache.NPCTextSumList.ContainsKey(pTemplate.id.Value))
            {
                if (GlobalCache.NPCTextSumList[pTemplate.id.Value] < clientbuild)
                {
                    GlobalCache.NPCTextSumList.Remove(pTemplate.id.Value);
                }
            }

            if (!GlobalCache.NPCTextSumList.ContainsKey(pTemplate.id.Value))
            {
                GlobalCache.NPCTextSumList.Add(pTemplate.id.Value, clientbuild);

                if (writesql) pTemplate.WriteSQLToFile();
            }

        }

        public static SortedList<string, int> QuestPOISumList = new SortedList<string, int>();
        public static void AddQuestPOISum(quest_poi pTemplate, int clientbuild)
        {
            if (!writesql) return;
            string key = string.Format("{0}-{1}", pTemplate.questid.Value, pTemplate.objindex.Value);
            if (GlobalCache.QuestPOISumList.ContainsKey(key))
            {
                if (GlobalCache.QuestPOISumList[key] < clientbuild)
                {
                    GlobalCache.QuestPOISumList.Remove(key);
                }
            }

            if (!GlobalCache.QuestPOISumList.ContainsKey(key))
            {
                GlobalCache.QuestPOISumList.Add(key, clientbuild);

                if (writesql) pTemplate.WriteSQLToFile();
            }

        }

        public static SortedList<string, int> QuestPOIPointsSumList = new SortedList<string, int>();
        public static void AddQuestPOIPointsSum(quest_poi_points pTemplate, int clientbuild)
        {
            if (!writesql) return;
            string key = string.Format("{0}-{1}-{2}", pTemplate.questid.Value,  pTemplate.x.Value, pTemplate.y.Value);
            if (GlobalCache.QuestPOIPointsSumList.ContainsKey(key))
            {
                if (GlobalCache.QuestPOIPointsSumList[key] < clientbuild)
                {
                    GlobalCache.QuestPOIPointsSumList.Remove(key);
                }
            }

            if (!GlobalCache.QuestPOIPointsSumList.ContainsKey(key))
            {
                GlobalCache.QuestPOIPointsSumList.Add(key, clientbuild);

                if (writesql) pTemplate.WriteSQLToFile();
            }

        }

        public static void AddUnitMovement(ulong guid, MovementInfo movementInfo)
        {
            //StringBuilder sb = new StringBuilder();
            //sb.Append("guid: " + guid.ToString() + ", [");
            //for (byte i = 0; i < movementInfo.speeds.Capacity; ++i)
            //{

            //    sb.Append(movementInfo.speeds[i.ToString()].ToString() + "          ");
            //}
            //sb.Append("]");

            //if (!UnitMovementList.Contains(sb.ToString())) UnitMovementList.Add(sb.ToString());
            //if (UnitMovementList.Count > 500)
            //{
            //    int count = UnitMovementList.Count;
            //}
        }

        public static SortedList<uint, int> CreatureEquipTemplateSumList = new SortedList<uint, int>();
        public static void AddCreatureEquipTemplateSum(creature_equip_template pTemplate, int clientbuild)
        {
            if (!writesql) return;
            if (GlobalCache.CreatureEquipTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (GlobalCache.CreatureEquipTemplateSumList[pTemplate.entry.Value] < clientbuild)
                {
                    GlobalCache.CreatureEquipTemplateSumList.Remove(pTemplate.entry.Value);
                }
            }

            if (!GlobalCache.CreatureEquipTemplateSumList.ContainsKey(pTemplate.entry.Value))
            {
                GlobalCache.CreatureEquipTemplateSumList.Add(pTemplate.entry.Value, clientbuild);

                if (writesql) pTemplate.WriteSQLToFile();
            }
        }

        public static SortedList<uint, int> CreatureTemplateAddonSumList = new SortedList<uint, int>();
        public static void AddCreatureTemplateAddonSum(creature_template_addon pTemplate, int clientbuild)
        {
            if (!writesql) return;
            if (GlobalCache.CreatureTemplateAddonSumList.ContainsKey(pTemplate.entry.Value))
            {
                if (GlobalCache.CreatureTemplateAddonSumList[pTemplate.entry.Value] < clientbuild)
                {
                    GlobalCache.CreatureTemplateAddonSumList.Remove(pTemplate.entry.Value);
                }
            }

            if (!GlobalCache.CreatureTemplateAddonSumList.ContainsKey(pTemplate.entry.Value))
            {
                GlobalCache.CreatureTemplateAddonSumList.Add(pTemplate.entry.Value, clientbuild);

                if (writesql) pTemplate.WriteSQLToFile();
            }
        }

        public static CreatureAuraList creatureAuraList = new CreatureAuraList();
        private static IDictionary<uint, CreatureAuraList.CreatureAura> creatureAuraLinkList = new Dictionary<uint, CreatureAuraList.CreatureAura>();

        private static SortedList<uint, byte> _ValidAuraSpellIDEffectList = null;
        public static SortedList<uint, byte> ValidAuraSpellIDEffectList
        {
            get
            {
                if (_ValidAuraSpellIDEffectList == null)
                {
                    _ValidAuraSpellIDEffectList = (new DBCDatabase("dbc_332", true)).ValidAuraSpellIDEffectList();
                }
                return _ValidAuraSpellIDEffectList;
            }
        }


        public static bool IsValidInitialAura(uint entry, uint pSellId)
        {
            var valid = pSellId != 0 && ValidAuraSpellIDEffectList.ContainsKey(pSellId);
            if (valid)
            {
                if (!creatureAuraLinkList.ContainsKey(entry))
                {
                    CreatureAuraList.CreatureAura aura = new CreatureAuraList.CreatureAura(true);
                    aura.entry = entry;
                    creatureAuraLinkList.Add(entry, aura);
                    creatureAuraList.Add(aura);
                }

                if (!creatureAuraLinkList[entry].auralist.Contains(pSellId)) creatureAuraLinkList[entry].auralist.Add(pSellId);
            }

            return valid;
        }



    }
}
